package com.nuyoah.controller;


import cn.dev33.satoken.stp.StpUtil;
import com.nuyoah.common.dto.CourseDto;
import com.nuyoah.common.lang.Result;
import com.nuyoah.entity.Course;
import com.nuyoah.entity.User;
import com.nuyoah.service.CourseService;
import com.nuyoah.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * 课程表接口
 *
 * @author xyx
 * @since 2024-06-15
 */
@RestController
@RequestMapping("/course")
public class CourseController {

    @Autowired
    private UserService userService;

    @Autowired
    private CourseService courseService;


    /**
     * 添加课程。
     * 通过@RequestBody注解，将HTTP请求体中的数据绑定到Course对象上，然后调用课程服务层添加课程。
     *
     * @param course 待添加的课程对象
     * @return 添加结果，成功则返回添加的课程信息，失败则返回错误信息
     */
//添加课程
    @RequestMapping("/add")
    public Result add(@RequestBody Course course) {
        return Result.succ(courseService.addCourse(course));
    }

    /**
     * 删除课程。
     * 通过@RequestParam注解，从HTTP请求参数中获取课程ID，然后调用课程服务层删除指定ID的课程。
     *
     * @param id 待删除课程的ID
     * @return 删除结果，成功则返回成功信息，失败则返回错误信息
     */
//删除课程
    @RequestMapping("/delete")
    public Result delete(@RequestParam("id") Integer id) {
        return Result.succ(courseService.deleteCourse(id));
    }

    /**
     * 修改课程。
     * 通过@RequestBody注解，将HTTP请求体中的数据绑定到Course对象上，然后调用课程服务层更新指定课程的信息。
     *
     * @param course 待修改的课程对象，包含新的课程信息
     * @return 修改结果，成功则返回修改后的课程信息，失败则返回错误信息
     */
//修改课程
    @RequestMapping("/update")
    public Result update(@RequestBody Course course) {
        return Result.succ(courseService.updateCourse(course));
    }

    /**
     * 获取所有课程信息
     *
     * @return Result 包含所有课程的DTO列表的成功响应
     *
     * 本方法通过调用courseService获取所有课程的列表，
     * 然后将课程列表转换为更详细的课程DTO列表，
     * 最后返回包含DTO列表的成功响应。
     */
    //获取所有课程列表
    @RequestMapping("/all")
    public Result all() {
        // 从服务层获取所有课程的列表
        // 获取所有课程列表
        List<Course> courseList = courseService.getAllCourseList();
        // 将课程列表转换为课程DTO列表，以提供更丰富的信息
        // 将课程列表转换为包含更多详细信息的课程DTO列表
        List<CourseDto> courseDtoList = courseService.getCourseDtoList(courseList);
        // 返回包含所有课程DTO的成功响应
        // 返回成功的响应，包含课程DTO列表
        return Result.succ(courseDtoList);
    }

    /**
     * 查询用户的课程列表。
     * 通过登录用户的ID获取该用户所选的课程信息，并返回课程的详细列表。
     *
     * @return 成功返回用户的课程列表，失败返回错误信息。
     */
    //查询课程列表
    @RequestMapping("/list")
    public Result list() {
        // 获取当前登录用户的ID
        Integer ids = StpUtil.getLoginIdAsInt();

        // 根据用户ID查询用户信息
        //通过id到用户表中查询用户信息
        User user = userService.getUserById(ids);
        // 检查用户是否存在
        // 如果用户不存在，则返回错误信息
        if (user == null) {
            return Result.fail("用户不存在");
        }

        // 获取用户的ID，用于后续查询用户的课程信息
        // 获取用户的ID，用于进一步查询学生详细信息
        Integer id = user.getId();

        // 根据用户ID查询用户的课程列表
        List<Course> courseList = courseService.getCourseListByStudentId(id);
        // 检查用户是否有课程
        // 如果课程不存在，则返回错误信息
        if (courseList.isEmpty()) {
            return Result.fail("课程不存在");
        }

        // 将课程列表转换为包含更多详细信息的课程DTO列表
        //将课程列表中的每条记录的teacher_id替换为user表中的姓名,并存进courseDto中
        List<CourseDto> courseDtoList = courseService.getCourseDtoList(courseList);

        // 返回成功的响应，包含课程DTO列表
        // 返回课程信息
        return Result.succ(courseDtoList);
    }


}
